import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: 12629
 * Date: 2021/11/2
 * Time: 8:38
 * Description:
 * <T>:只是MyArrayList类是一个泛型类
 */
class MyArrayList<T> {
    public T[] elem;
    //public T[] elem = new T[10] ; 实质上：Object[] elem = new Object[10] ;
    public int usedSize;

    public MyArrayList() {
        this.elem = (T[])new Object[10];
    }

    public void add(T val) {
        this.elem[this.usedSize++] = val;
    }

    public T get(int pos) {
        return this.elem[pos];
    }

    //假设你这样的代码能成立
    public Object[] getArray(int size) {
        Object[] genericArray = new Object[size]; // suppose this is allowed
        return genericArray;
    }
}

/**
 * 1、泛型参数是不参与类型的组成的，为什么？这个和Java泛型的特性有关系。
 *    泛型是在编译时期的一种机制，主要在编译期间做两点：
 *    1、自动进行类型检查
 *    2、可以不进行强制类型转换
 * 2、擦除机制
 * 3、数组不能整体进行向下转型的
 */
public class TestDemo {

    public List<List<Integer>> generate(int numRows) {

        List<List<Integer>> ret = new ArrayList<>();

        List<Integer> list0 = new ArrayList<>();
        list0.add(1);

        ret.add(list0);

        for(int i = 1; i < numRows;i++) {
            List<Integer> list = new ArrayList<>();
            list.add(1);//头
            //1、获取上一行
            List<Integer> prevRow = ret.get(i-1);
            for(int j = 1;j < i ;j++) {
                int val = prevRow.get(j) + prevRow.get(j-1);
                list.add(val);
            }
            list.add(1);//尾巴
            ret.add(list);
        }
        return ret;
    }

    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        List<List<Integer>> lists = new ArrayList<>();

        List<List<Integer>> lists1 = new LinkedList<>();
        List<Integer> lists2 = new LinkedList<>();
    }

    public static void main2(String[] args) {
        MyArrayList<Integer> myArrayList = new MyArrayList<>();
        String[] ret = (String[])myArrayList.getArray(10);
    }
    public static void main1(String[] args) {
        MyArrayList<Integer> myArrayList = new MyArrayList<>();
        myArrayList.add(1);
        myArrayList.add(2);
        int val = myArrayList.get(0);

        MyArrayList<String> myArrayList2 = new MyArrayList<>();

        MyArrayList myArrayList3 = new MyArrayList<>();

    }
}
